package com.heima.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.admin.mapper.AdChannelMapper;
import com.heima.admin.service.AdChannelService;
import com.heima.common.exception.config.CustException;
import com.heima.model.admin.dtos.ChannelDto;
import com.heima.model.admin.pojos.AdChannel;
import com.heima.model.common.dtos.PageResponseResult;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * @Description:
 * @Version: V1.0
 */
@Service
public class AdChannelServiceImpl extends ServiceImpl<AdChannelMapper, AdChannel>
        implements AdChannelService {


    /**
     * 根据ID删除频道
     * @param id
     * @return
     */
    @Override
    public ResponseResult delete(Integer id) {
        //1 参数校验
        if (id == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        //2 执行删除（先查询在删除）
        AdChannel channel = getById(id);
        if (channel == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
        }
        // 频道状态是 启用则不能删除
        if (channel.getStatus()) {
            return ResponseResult.errorResult(AppHttpCodeEnum.ADMING_CHANNEL_STATUS_TRUE);
        }

        // TODO 频道下存在文章是否可以删除  产品设计
        removeById(id);

        //3 返回结果
        return ResponseResult.okResult();
    }

    /**
     * 修改频道及频道状态
     * @param adChannel
     * @return
     */
    @Override
    public ResponseResult update(AdChannel adChannel) {
        //1 参数校验
//        if (adChannel == null || StringUtils.isBlank(adChannel.getName())
//                || adChannel.getId() == null) {
//            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
//        }

        //2 执行修改
        AdChannel channel = getById(adChannel.getId());
        if (channel == null) {
            //return ResponseResult.errorResult(AppHttpCodeEnum.ADMING_CHANNEL_NOT_EXIST);

            // 程序主动抛出异常，记录用户操作日志，方便后期调试
            // 给用户看....
            //throw new RuntimeException("查询频道不存在");
            //throw new CustomException(AppHttpCodeEnum.SERVER_ERROR, "查询频道不存在");
            CustException.cust("查询频道不存在");
        }

        // 是否默认
        if (adChannel.getIsDefault()) {
            // 查询原有默认频道
            AdChannel one = getOne(Wrappers.<AdChannel>lambdaQuery().eq(AdChannel::getIsDefault, 1));
            if (one != null) {
                if (adChannel.getId().intValue() != one.getId().intValue()) {
                    one.setIsDefault(false); // 修改为非默认
                    updateById(one);
                }
            }
        }
        updateById(adChannel);

        //3 返回结果
        return ResponseResult.okResult();
    }

    /**
     * 新增
     * @param adChannel
     * @return
     */
    @Override
    public ResponseResult insert(AdChannel adChannel) {
        //1 参数校验
//        if (adChannel == null || StringUtils.isBlank(adChannel.getName())) {
//            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
//        }

        //2 执行保存
        //是否默认
        if (adChannel.getIsDefault()) { // 作为默认 true
            // 查询原有默认频道
            AdChannel one = getOne(Wrappers.<AdChannel>lambdaQuery().eq(AdChannel::getIsDefault, 1));
            if (one != null) {
                one.setIsDefault(false); // 修改为非默认
                updateById(one);
            }
        }

        //补齐参数
        adChannel.setCreatedTime(new Date());
        // 保存
        save(adChannel);

        //3 返回结果
        return ResponseResult.okResult();
    }

    /**
     * 分页条件查询
     * @param dto
     * @return
     */
    @Override
    public ResponseResult findByNameAndPage(ChannelDto dto) {

        //1 校验参数
        if (dto == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        // 校验page和size
        dto.checkParam();


        //2 构建条件，执行查询
        LambdaQueryWrapper<AdChannel> wrapper = Wrappers.<AdChannel>lambdaQuery();
//        if (dto.getName() != null && dto.getName().length() >0)

        if (StringUtils.isNotBlank(dto.getName())) { // name 模糊查询
            wrapper.like(AdChannel::getName, dto.getName().trim());
        }

        // 状态查询
        if (ObjectUtils.allNotNull(dto.getStatus())) {
            wrapper.eq(AdChannel::getStatus, dto.getStatus());
        }
        // 分页对象
        IPage<AdChannel> ipage = new Page<>(dto.getPage(), dto.getSize());

        // 排序 升序
        wrapper.orderByAsc(AdChannel::getOrd);

        IPage<AdChannel> pageResult = page(ipage, wrapper);

       // int i = 1 / 0;  // 模拟异常出现

        //3 封装查询结果并返回 (要啥给啥)
//        PageResponseResult result = new PageResponseResult(dto.getPage(), dto.getSize(), pageResult.getTotal());
//        result.setData(pageResult.getRecords());
        PageResponseResult result = new PageResponseResult(dto.getPage(), dto.getSize(),
                pageResult.getTotal(), pageResult.getRecords());

        return result;
    }
}
